
.text
.global _start

_start:

    /* 关闭看门狗 */
    ldr r0,=0x53000000
    mov r1,#0
    str r1,[r0]



    /* 设置 MPLL ， FCLK ： HCLK ： PCLK = 400m : 100m : 50m */
    /* LOCKTIME(0x4C000000) = 0xFFFFFFFF */
    ldr r0, =0x4C000000
    ldr r1, =0xFFFFFFFF
    str r1, [r0]

    /* CLKDIVN(0x4C000014) = 0x5 , tFCLK:tHCLK:tPCLK = 1:4:8 */
    ldr r0, =0x4C000014
    ldr r1, =0x5
    str r1, [r0]

    /* 设置 CPU 工作于异步模式 */
    mrc p15,0,r0,c1,c0,0
    orr r0,r0,#0xc0000000 // R1_nF:OR:R1_iA
    mcr p15,0,r0,c1,c0,0

    /**
     * 设置 MPLLCON (0x4C000004) =  (92<<12) | (1<<4) |  (1<<0)
     *　Mpll = (2*m*Fin)/(p*2^s)
     *  m = MDIV + 8
     *  p = PDIV + 2
     *  s = SDIV + 1
     *  Fin = 12M (时钟源)
     */
     ldr r0, =0x4C000004
     ldr r1, =(92<<12)|(1<<4)|(1<<0)
     str r1, [r0]

     /**
      * 一旦设置 PLL ， 就会锁定 lock time 知道 PLL 输出稳定
      * 然后 CPU 工作于新的频率
      */



    /* 设置内存： sp栈 */
    /**
     * 分辨 nor/nand 启动
     * 写 0 到 0 地址，再读出来
     * 如果得到 0 ， 表示 0 地址上的内容被修改了，它对应ram，这就是 nand 启动
     * 否则就是 nor 启动
     */    
    mov r1,#0
    ldr r0,[r1] /* 读出原来的值备份 */
    str r1,[r1] /* 0 -> [0] */
    ldr r2,[r1] /* [r2] = [0] */
    cmp r1,r2   /* r1 == r2 ? 相等 表示是 NAND 启动 */
    ldr sp, =0x40000000+4096   /* 先假设是 nor 启动 */
    moveq sp,#4096  /* NAND 启动 */
    streq r0,[r1]     /* 恢复原来的值 */


    bl main

halt:
    b halt